package main.leetcode.offer.firstround.from03to50;

/**
 * 44.数字序列中某一位的数字
 *
 * <p>数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中，第5位（从下标0开始计数）是5，第13位是1，第19位是4，等等。
 *
 * <p>请写一个函数，求任意第n位对应的数字。
 *
 * <p>示例 1： 输入：n = 3 输出：3
 *
 * <p>示例 2： 输入：n = 11 输出：0
 *
 * <p>限制： 0 <= n < 2^31
 */
public class ex44 {
    public static void main(String[] args) {
        System.out.println(new ex44().findNthDigit(365));
    }

    public int findNthDigit(int n) {
        // n -= 1; // 令n直接表示下标，因为本身是从1开始的序列
        for (long digits = 1; digits < 11; ++digits) { // digits表示对应数字所在区间的位数，1/2/3
            int first = (int) Math.pow(10, digits - 1); // 确定区间首位数，1/10/100
            if (n < 9 * first * digits) { // 对比区间最大值所在下标，9/180/2700
                return String.valueOf //
                                (first + n / digits) // 计算对应的值
                                .charAt((int) (n % digits)) // 对应的下标
                        - '0';
            }
            n -= 9 * first * digits; // 减掉该区间总位数9，寻找在下一个区间的数值
        }
        return 0;
    }
}
